#include<stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
 #include <sys/wait.h>

typedef void (*func_t)();

#define NUM 5
func_t handlers[NUM+1];
// 如下任务
void Download()
{
	printf("我是一个下载任务\n");
}
void Flush()
{
	printf("我是一个刷新任务\n");
}
void Log()
{
	printf("我是一个记录日志的任务\n");
}
void registerHandler(func_t h[],func_t f)
{
	int i = 0;
	for(;i<NUM;i++)
		if (h[i] == NULL) break;
	if (i==NUM) return;
	h[i] = f;
	h[i+1] = NULL;
}

int main()
{
	registerHandler(handlers,Download);
	registerHandler(handlers,Flush);
	registerHandler(handlers,Log);
	pid_t id = fork();
	if (id == 0)
	{
		while(1)
		{
			sleep(3);
			printf("我是一个子进程, pid : %d, ppid : %d\n", getpid(), getppid());
			sleep(1);
		}
		exit(20);
	}
	while(1)
	{
		int status = 0;
		pid_t cid = waitpid(id,&status,WNOHANG);
		if (cid>0)
		{
			printf("wait success, cid: %d, exit code:%d,exit signal: %d\n",cid, WEXITSTATUS(status),status    &0x7F);
			break;
		}
		else if (cid == 0)
		{
			// 函数指针进行回调
			int i = 0;
			for(;handlers[i];i++)
			{
				handlers[i]();
			}
			printf("本轮调用结束，子进程没有退出\n");
			sleep(1);
		}
		else
		{
			printf("等待失败\n");
			break;
		}
	}
	return 0;
}

//int main()
//{
//	pid_t id = fork();
//	if (id==0)
//	{
//		// 子进程
//		while (1)
//		{
//			printf("我是子进程，pid: %d，ppid: %d\n",getpid(),getppid());
//			sleep(1);
////			int a = 10;
////			a/=0;
//			int * p =0;
//			*p = 100;
//		}
//		
//		exit(100);
//	}
//	// 父进程
//	int status = 0;
//	pid_t cid = waitpid(id,&status,0);
//	if (cid > 0 )
//	{
//		if (WIFEXITED(status))
//			printf("wait success, cid: %d, exit code:%d,exit signal: %d\n",cid, WEXITSTATUS(status),status&0x7F);
//		else
//			printf("子进程退出异常\n");
//		 
//	}
//	else
//	{
//		printf("wait failed: %d ->%s\n",errno,strerror(errno));	
//	}
//	return 0;
//}


//int main()
//{
//	pid_t id = fork();
//	if (id==0)
//	{
//		// 子进程
//		int cnt = 5;
//		while (cnt)
//		{
//			printf("我是子进程，pid: %d，ppid: %d\n",getpid(),getppid());
//			sleep(1);
//			cnt--;
//		}
//		
//		exit(100);
//	}
//	// 父进程
//	int status = 0xFFFF;
//	pid_t cid = waitpid(id,&status,0);
//	if (cid > 0 )
//	{
//		//printf("wait success, cid: %d, status:%d\n",cid,status);
//		printf("wait success, cid: %d, status:%d\n",cid,(status>>8));
//		//printf("wait success, cid: %d, status:%d\n",cid,(status>>8)&0xFF);
//	}
//	else
//	{
//		printf("wait failed: %d ->%s\n",errno,strerror(errno));	
//	}
//	return 0;
//}

//int main()
//{
//	pid_t id = fork();
//	if (id==0)
//	{
//		// 子进程
//		int cnt = 5;
//		while (cnt)
//		{
//			printf("我是子进程，pid: %d，ppid: %d\n",getpid(),getppid());
//			sleep(1);
//			cnt--;
//		}
//		
//		exit(0);
//	}
//	// 父进程
////	sleep(100);
//	//pid_t cid = wait(NULL);
//	//pid_t cid = waitpid(id,NULL,0);
//	pid_t cid = waitpid(id+1,NULL,0);
//	if (cid > 0 )
//	{
//		printf("wait success, cid: %d\n",cid);
//	}
//	else
//	{
//		printf("wait failed:, %d: %s\n",errno,strerror(errno));
//	}
//	sleep(10);
//	return 0;
//}

//int main()
//{
//	printf("main!\n");
//	sleep(2);
//	_exit(23);
//}
//void func()
//{
//	printf("func begin!\n");
//	exit(20);
//	printf("func end\n");
//}
//int main()
//{
//	func();
//	printf("main!\n");
//	return 0;
//}


//int main()
//{
//	int a = 10;
//	a/=0;
//	printf("代码执行完毕!");
//	return 0;
//}


//int main()
//{
//	int i = 0 ;
//	for(;i<200;i++)
//	{
//		printf("%d ->%s\n",i,strerror(i));
//	}
//	FILE* p = fopen("log.txt","r");
//	if (p==NULL)
//		return errno;
//	fclose(p);
//	return 0;
//}



//int func()
//{}
//int main()
//{
//	int a = 10;
//	int ret = func();
//	printf("ret = %d\n",ret);
//	return 0;
//}
